// 1. 函数定义的方式
//  a. 函数声明   function fn() {};  函数可以提前调用然后再声明【函数声明会提前】
//  b. 函数表达式  var fn = function() {};   函数表达式不能先调用再声明【因为函数表达式是把函数附给一个变量做为他的值，而变量在没有声明之前就调用是要出错的】
//  函数声明是优于变量提升的!!!


/*
    函数声明优于变量声明
    函数表达式会将变量提升，但是代码在执行的时候才会被赋值
*/ 

// console.log('______________________________________________________eg1_______________________________________________________')
test();   // 我是函数   [函数声明优于变量声明]
console.log(test);   // function test() {console.log('我是函数')}
function test() {
    console.log('我是函数');
};
console.log(test);    // function test() {console.log('我是函数')}
var test = '我是变量';      // [变量只有语句执行到这才回被赋值并且覆盖内存]
console.log(test);   // 我是变量   
var test = function() {     // [执行到这里之后，函数表达式覆盖了前面的代码]
    console.log('我是函数表达式');
};
console.log(test);   // function test() {console.log('我是函数表达式')}
test();    // 我是函数表达式





// console.log('______________________________________________________eg2_______________________________________________________')

test();   // 我是函数   [函数声明提升]
console.log(test);  // function test() {console.log('我是函数')};   [函数声明提升]
var test = '我是变量';    // [定义了变量, 语句执行到这 test被声明且赋值]  
console.log(test);        // 我是变量
var test = function () {      // [赋值被覆盖]
    console.log('我是函数表达式');
};
console.log(test);   // function test() {console.log('我是函数表达式')}
function test() {  
    console.log('我是函数');
};

console.log(test);   // function test() {console.log('我是函数表达式')}
test();  // 我是函数表达式


console.log('______________________________________________________eg2_______________________________________________________')

test();   // 我是函数   【不是只有调用的时候才会提前】

var test = function() {    // [声明变量且赋值函数]
    console.log('我是函数表达式');
};

function test() {     // [函数声明提前]
    console.log('我是函数');
};

test();   // 我是函数表达式
